class Person{
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object obj) {
        Person person=(Person) obj;
        return this.name.equals(person.name)&&this.age==person.age;
    }


}

class Student extends Person{

}

public class Test {
    public static void main(String[] args) {
        Person person=new Person("bit",10);
        Person person1=new Person("bit",10);

        //Object是person的父类，当没用进行重写的时候调用的就是是obj.toString();
        System.out.println(person);//Person@4eec7777

        //而当Person类中对toString()进行重写后，发生动态绑定会调用子类person的toString()方法
        System.out.println(person);//Person{name='bit', age=10}

        //equals同理调用的是父类Object的方法，而父类equals方法对下列进行比较的是person和person1的地址
        System.out.println(person.equals(person1));//false

        //而当Person类对其进行重写后，可以比较name，age属性
        System.out.println(person.equals(person1));//true

    }

    public static void main1(String[] args) {
        //Object类是所有类的父类，即使没有显示，也默认是
        //因此Person,Student类能够向上转型
        Object obj1=new Person();
        Object obj2=new Student();
        //alt+7可以查看Object结构，方法，目前主要用的是toString,equals,hasCode，clone
    }





}
